
#include <QFileDialog>

#include "ventanaprincipal.h"
#include "ui_ventanaprincipal.h"
#include "dialogo.h"
#include "panelpreferencias.h"
#include "visorinstrumento.h"
#include "editorcompases.h"

#define LATENCIA_VISUALIZACION 40

VentanaPrincipal::VentanaPrincipal(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::VentanaPrincipal)
{
    ui->setupUi(this);

    QPixmap imagen(":/entrendor/Resources/caja.png");	
	setWindowIcon(QIcon(imagen));    

	idTemporizadorVisualizacion = 0;

	actualizarMenu();

}

VentanaPrincipal::~VentanaPrincipal()
{
    delete ui;

    Entrenador::destruir();
}

void VentanaPrincipal::on_actionPreferencias_triggered()
{
    Dialogo dialogo(this);

    PanelPreferencias* panel = new PanelPreferencias();

    dialogo.setContenido(panel);

    dialogo.exec();
}

void VentanaPrincipal::on_actionIniciar_triggered()
{	
	if (idTemporizadorVisualizacion > 0) {
		return;
	}

	Entrenador::getInstancia()->arrancar();
	idTemporizadorVisualizacion = startTimer(LATENCIA_VISUALIZACION);
	
}

void VentanaPrincipal::on_actionFinalizar_triggered()
{
	Entrenador::getInstancia()->parar();
	killTimer(idTemporizadorVisualizacion);
	idTemporizadorVisualizacion = 0;
}

void VentanaPrincipal::timerEvent(QTimerEvent* event)
{
	actualizarVistas();
}

void VentanaPrincipal::actualizarVistas()
{
	//Entrenador::getInstancia()->actualizar();

	ui->visorInstrumento->actualizar();
	ui->visorLineaTiempo->actualizar();
}

void VentanaPrincipal::actualizarMenu()
{
	bool hayProyectoAbierto = Entrenador::getInstancia()->getProyecto() != NULL;
	ui->actionGuardarProyecto->setEnabled(hayProyectoAbierto);
    ui->actionGuardarProyectoComo->setEnabled(hayProyectoAbierto);
    ui->actionCerrarProyecto->setEnabled(hayProyectoAbierto);
	ui->actionEditarProyecto->setEnabled(hayProyectoAbierto);
}

void VentanaPrincipal::on_actionNuevoProyecto_triggered()
{
	Proyecto* proyecto = new Proyecto();
	Entrenador::getInstancia()->setProyecto(proyecto);

    ui->visorLineaTiempo->setCompas(Compas());
	actualizarVistas();
	actualizarMenu();
}

void VentanaPrincipal::on_actionAbrirProyecto_triggered()
{
	QString nombreFichero = QFileDialog::getOpenFileName(this, tr("Proyecto entrenador"), "../proyectos", tr("archivo XML (*.xml)"));

	if (nombreFichero.isEmpty()) {
		return;
	}

	Proyecto* proyecto = new Proyecto();
	proyecto->deserializar(nombreFichero);
	Entrenador::getInstancia()->setProyecto(proyecto);

    ui->visorLineaTiempo->setCompas(Compas());

	actualizarVistas();
	actualizarMenu();
    actualizarListaCompases();
}

void VentanaPrincipal::on_actionGuardarProyecto_triggered()
{
	Proyecto* proyecto = Entrenador::getInstancia()->getProyecto();
	if (proyecto == NULL) {
		return;
	}

	QString nombreArchivo = proyecto->getNombreArchivo();
	if (nombreArchivo.isEmpty()) {
		on_actionGuardarProyectoComo_triggered();
	}

	proyecto->serializar(nombreArchivo);
}

void VentanaPrincipal::on_actionGuardarProyectoComo_triggered()
{

	Proyecto* proyecto = Entrenador::getInstancia()->getProyecto();
	if (proyecto == NULL) {
		return;
	}
	
	QString nombreFichero = QFileDialog::getSaveFileName(this, tr("Guardar proyecto"), "../proyectos/" + proyecto->getNombreArchivo(), tr("archivo XML (*.xml)"));

	if (nombreFichero.isEmpty()) {
		return;
	}

	proyecto->serializar(nombreFichero);
}

void VentanaPrincipal::on_actionCerrar_triggered()
{
	Entrenador::getInstancia()->setProyecto(NULL);

    ui->visorLineaTiempo->setCompas(Compas());

    actualizarVistas();
	actualizarMenu();
    actualizarListaCompases();
}

void VentanaPrincipal::on_actionEditarProyecto_triggered()
{
	Proyecto* proyecto = Entrenador::getInstancia()->getProyecto();
	if (proyecto == NULL) {
		return;
	}

    EditorCompases editorCompases(this);

	editorCompases.setListaCompases(proyecto->getListaCompases());
	if (editorCompases.mostrarDialogo("Compases", true, DIALOGO_TIPO_ACEPTAR_CANCELAR)) {
		proyecto->setListaCompases(editorCompases.getListaCompases());
	}

    //TODO: reseleccionar el copmas ui->visorLineaTiempo->setCompas(Compas());

    actualizarListaCompases();
	actualizarVistas();
}

void VentanaPrincipal::actualizarListaCompases()
{
    ui->listwidgetCompases->clear();

    Proyecto* proyecto = Entrenador::getInstancia()->getProyecto();
	if (proyecto == NULL) {
        ui->listwidgetCompases->clear();
		return;
	}

    QStringList listaNombres;
    foreach (Compas compas, proyecto->getListaCompases()) {
        listaNombres.append(compas.getNombre());
    }

    ui->listwidgetCompases->addItems(listaNombres);
}

void VentanaPrincipal::on_listwidgetCompases_currentRowChanged(int currentRow)
{
    Entrenador::getInstancia()->seleccionarCompas(currentRow);
    ui->visorLineaTiempo->setCompas(Entrenador::getInstancia()->getCompasSeleccionado());
    actualizarVistas();
}

void VentanaPrincipal::on_actionSalir_triggered()
{
    close();
}
        